﻿本节将以 x86 计算机启动流程（图 \ref{BOOT_PROCEDURE}）为线索，实现对一个最简操作系统内核程序的引导和装载。
传统 x86 计算机启动到操作系统加载运行需要经历三个阶段：基本输入输出系统、主引导记录程序、引导加载器。
各个阶段之间通过跳转指令衔接，操作系统内核运行所需的初始环境将在这三个阶段以递进的方式初始化完成。

\begin{figure}[h!]
    \Centering
    \caption{计算机启动流程}
    \label{BOOT_PROCEDURE}
    \includegraphics[scale=0.75]{build/Paper/Assets/Boot-Procedure.pdf}
\end{figure}

\begin{enumerate}
    \item[（1）] \textbf{基本输入输出系统}：
    x86 计算机启动后将首先进入实模式（Real Mode），工作于实模式下的程序中使用的地址就是实际的物理内存地址。
    CPU 的 \lstinline{CS:IP} 寄存器在启动时被置为 \lstinline{0xF000:0xFFF0}，对应于 20 位的物理地址 \lstinline{0xF'FFF0}。
    这一物理地址被映射到主板上的一块固件中，该固件中保存了基本输入输出系统（Basic Input/Ouput System，BIOS）的指令，因而被称作 BIOS 固件。
    固件地址 \lstinline{0xF'FFF0} 处存放了这样一条指令：\lstinline{jmpf 0xF000:0xE05B}。
    该指令中的跳转目标对应于 BIOS 的入口地址，CPU 随后跳转至 \lstinline{0xF000:0xE05B} 处执行 BIOS 固件中的指令。
    BIOS 完成对硬件设备（如 RAM 内存）的检测，在 RAM 内存中建立一张中断向量表（Interupt Vector Table, IVT）用于提供字符打印、读写磁盘等的功能。
    这些功能由 BIOS 通过中断服务的方式提供，可通过 \lstinline{int} 指令触发软中断的方式调用（仅限实模式下使用）。
    \item[（2）] \textbf{主引导记录}：
    BIOS 执行过程中，会检测硬盘等外部设备，外部设备中有一类被称作可引导设备（Bootable Devices）的特殊设备。
    可引导设备中的第一个扇区（占 \Bytes{512}）最后两字节为魔数 \lstinline{0x55 0xAA}，该扇区亦被称为主引导记录（Master Boot Record，MBR）。
    BIOS 将主引导记录加载到内存地址 \lstinline{0:0x7C00} 处，通过跳转指令 \lstinline{jmpf 0:0x7C00} 将控制权移交给主引导记录程序。
    主引导记录的任务是将引导加载器（Boot Loader）从磁盘加载到内存，然后将控制权交付给引导加载器。
    \item[（3）]\textbf{引导加载器}：
    引导加载器为操作系统内核完成启动前的一系列初始化工作，主要包括：
    \begin{enumerate}
        \item[（a）] 获取操作系统所需重要的硬件信息（本项目中仅涉及物理内存信息）
        \item[（b）] 初始化全局描述符表（Global Descriptor Table），开启保护模式。
        \item[（c）] 开启分页机制并建立一张初始的页目录（Page Directory）和页表（Page Table）。
        \item[（d）] 加载操作系统内核文件映像到内存，并装载到正确位置。
    \end{enumerate}

以上步骤完成后，引导加载器执行一条跳转指令跳转到操作系统内核入口地址，至此，计算机引导流程结束，操作系统内核完全接管计算机硬件。

\end{enumerate}

调试是操作系统内核开发至关重要的环节，所耗时间达到内核开发的一半以上，优秀的调试工具结合良好的调试方案能够极大地减轻排查错误的负担。
作为操作系统内核开发的前置章节，本章除了为 SimpleOS 定制主引导记录和引导加载器，设计操作系统内核中频繁使用的功能模块，还将简要探讨常用的操作系统内核调试技术，给出操作系统内核调试方案。
